#include <iostream>
#include <unistd.h>
#include <fcntl.h>
#include <stdint.h>
#include <sys/timerfd.h>


int main()
{
    //1. 创建一个timerfd
    int timerfd = ::timerfd_create(CLOCK_MONOTONIC,0);
    //flag == 0 表示默认的文件描述符是阻塞读取的，没有数据就一直阻塞住。
    if (timerfd < 0){
        perror("timerfd create error");
        return -1;
    }
    //2. 初始化超时时间
    struct itimerspec item;
    item.it_value.tv_sec = 1; // 第一次超时的秒数
    item.it_value.tv_nsec = 0; //第一次超时的纳秒
    item.it_interval.tv_sec = 1; //在第一次超时之后超时的间隔秒数
    item.it_interval.tv_nsec = 0;//在第一次超时之后超时的间隔纳秒数
    //3. 设置超时
    auto ret = ::timerfd_settime(timerfd,0,&item,nullptr);
    if (ret < 0){
        perror("timerfd_settime error");
        return ret; 
    }
    //4. 获取超时时间  
    while (true){
        //这里需要注意每一次写入的都是8字节的内容，所以如果我们要读取的话必须是8字节读取
        uint64_t cnt; 
        int n = read(timerfd,&cnt,8);
        if (n < 0){
            perror("read error");
            break;
        }
        std::cout << "超时了: " << cnt << "次" << std::endl;
        sleep(3);
    }
    return 0;
}